// 1. 定义命名空间
frappe.provide('frappe.zelin');

/**
 * 核心文件下载逻辑。
 */
const triggerFileDownload = (hexContent, fileName, contentType) => {
    try {
        const hex = hexContent;
        const byteArray = new Uint8Array(hex.length / 2);
        
        for (let i = 0; i < hex.length; i += 2) {
            byteArray[i / 2] = parseInt(hex.substr(i, 2), 16);
        }
        
        const blob = new Blob([byteArray], { type: contentType });
        const url = window.URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = fileName;
        a.style.display = 'none';
        
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        
        setTimeout(() => {
            window.URL.revokeObjectURL(url);
        }, 100);
        
    } catch (error) {
        frappe.msgprint({
            title: __('Download Error'),
            message: __('Failed to download file. Please try again.'),
            indicator: 'red'
        });
    }
};


/**
 * 核心导出逻辑，负责调用后端 API 并处理结果/下载。
 * @param {Object} args - 包含 doc, template_file, template_name, export_file_name, language 的对象。
 * @param {string} type - 'pdf' 或 'excel'。
 */
const performExportCore = (args, type) => {
    const apiUrl = type === 'pdf' 
        ? 'zelin_export_excel_template.api.export_pdf'
        : 'zelin_export_excel_template.api.export_data';
    
    frappe.show_alert({message: __('Starting export...'), indicator: 'blue'});

    frappe.call({
        method: apiUrl,
        args: args,
        callback: function(r) {
            if (r.message) {
                if (r.message.status === "queued") {
                    frappe.show_alert({ message: r.message.message, indicator: 'blue' });
                } else if (r.message.success && r.message.file_content) {
                    triggerFileDownload(
                        r.message.file_content, 
                        r.message.file_name, 
                        r.message.content_type
                    );
                    frappe.show_alert({ message: __('Export completed successfully'), indicator: 'green' });
                } else if (r.message.success === false) {
                    frappe.msgprint({ title: __('Export Failed'), message: r.message.message, indicator: 'red' });
                }
            }
        },
        error: function(r) {
             let errorMsg = __('Export error occurred');
             if (r.responseJSON && r.responseJSON._server_messages) {
                 try {
                     const serverMessages = JSON.parse(r.responseJSON._server_messages);
                     if (serverMessages.length > 0) {
                         const firstMsg = JSON.parse(serverMessages[0]);
                         errorMsg = firstMsg.message || errorMsg;
                     }
                 } catch (e) { }
             }
             
             frappe.msgprint({ title: __('Export Error'), message: errorMsg, indicator: 'red' });
        }
    });
};

/**
 * 【公开 API】导出功能：封装了多语言选择和核心调用。
 * 可用于 DocForm、ListView 和 ReportView。
 * @param {Object} doc - 要导出的 Doc 对象或模拟的 Doc 对象 (用于列表/报表: {items: [data]}).
 * @param {Object} template - 模板配置对象。
 * @param {string} type - 'pdf' 或 'excel'。
 */
frappe.zelin.export_excel_utils = {
    handleExport: (doc, template, type) => {
        
        // 封装实际的导出操作
        const performExport = (language = null) => {
            const args = {
                doc: doc,
                template_file: template.template_file,
                template_name: template.template_name,
                export_file_name: template.export_file_name || "",
                language: language
            };
            performExportCore(args, type);
        };

        // 处理多语言选择
        if (template.is_multi_language) {
            const dialog = new frappe.ui.Dialog({
                title: __('Select Language'),
                fields: [{
                    fieldtype: "Link",
                    options: "Language",
                    default: frappe.boot.lang,
                    label: __("Language"),
                    reqd: 1,
                    fieldname: "language"
                }],
                primary_action: (values) => {
                    performExport(values.language);
                    dialog.hide();
                },
                primary_action_label: __(`Export ${type.toUpperCase()}`)
            });
            dialog.show();
        } else {
            performExport();
        }
    }
};

// 导出方法到 window 以兼容旧代码或特殊需要 (可选，但推荐使用 frappe.zelin.export_excel_utils.handleExport)
// window.handleExport = frappe.zelin.export_excel_utils.handleExport;